package csvloader;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.text.BreakIterator;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.csvparser.CSVParser;
import com.google.api.GoogleAPI;
import com.google.api.translate.Language;
import com.google.api.translate.Translate;
import com.resource.ResourceBundleManager;

import csvloader.email.Email;
import csvloader.log.CLLogger;
import csvloader.logic.CsvFileImport;

public final class Test {
	public static void main(String[] args) throws IOException {
		// System.setOut(new PrintStream(System.out, true, "UTF-8"));
		// System.setErr(new PrintStream(System.err, true, "UTF-8"));

//		EdbCKEncoding enc = new EdbCKEncoding(new File(
//				"F:/person_import_template.csv"));
//		if (enc.getEncoding().equals("null")) {
//			System.err.println("文字コードが対応していません\r\nEUC/SJIS/UTF-8等 に変換して下さい。");
//			return;
//		}
//		System.out.println("\nInput File Encoding: " + enc.getEncoding());
//
//		StringBuffer body = new StringBuffer();
//
//		FileInputStream fis = new FileInputStream(
//				"F:/person_import_template.csv");
		// InputStreamReader isr = new InputStreamReader(fis,enc.getEncoding());
		// BufferedReader br = new BufferedReader(isr);
		// try {
		// String str;
		// while((str = br.readLine())!=null) {
		// body.append(str);
		// body.append("\n");
		// }
		// br.close(); isr.close(); fis.close();
		// } catch(Exception ex) {
		// ex.printStackTrace();
		// return;
		// }
		// String[][] records = parsetostring(body.toString());
		//      
		// for(int i=0;i<records.length;i++){
		// for(int ii=0;ii<records[i].length;ii++){
		// System.out.print(records[i][ii]);
		// System.out.print(", ");
		// }
		// System.out.println();
		// }
//		CSVParser csvParser = new CSVParser(fis);
//
//		long startTime = System.currentTimeMillis();
//
//		String[] lineData = csvParser.getLine();
//		while (lineData != null && lineData.length > 0) {
//			System.out.print("行：" + lineData[0] + "\r\n");
//			lineData = csvParser.getLine();
//		}
//		System.out.println("time elapsed: "
//				+ (System.currentTimeMillis() - startTime));
//		Email email = new Email();
//		try {
//			email.sendMail("liyi20080713@gmail.com", "liyi20080713@gmail.com", "test", "test");
//		} catch(Exception e){
//			System.out.println(e.getMessage());
//		}
		CsvFileImport bat = new CsvFileImport();
		try {
			long startTime = System.currentTimeMillis();
			bat.startImport(args);
			System.out.println("time elapsed: " + (System.currentTimeMillis() - startTime));
		} catch (Exception e){
			
		}
		
//		try {   
//			
//			 // Set the HTTP referrer to your website address.    
//			GoogleAPI.setHttpReferrer("");     
//			// Set the Google Translate API key     
//			// See: http://code.google.com/apis/language/translate/v2/getting_started.html     
//			GoogleAPI.setKey("");     
//			String translatedText = Translate.DEFAULT.execute("Bonjour le monde", Language.FRENCH, Language.ENGLISH);      
//			System.out.println(translatedText); 
//			} catch (Exception ex) {   
//			 ex.printStackTrace();   
//			}   
		
		            
//            System.out.println("--処理開始--");
//            args[0] = "2013年夏季新款清新sun小雨伞伞牌遮仔帆布短款钱包";
//            //コマンドライン引数が入力されているかチェックを行う
//            if(args.length == 0)
//            {
//                  System.out.println("コマンドライン引数を指定してください");
//                  return;
//            }            
//            
//            //単語毎の分割に使用するBreakIteratorのインスタンスを取得する
//            BreakIterator bit = BreakIterator.getWordInstance(Locale.TAIWAN);
//            
//            //BreakIteratorに分割対象の文字列を設定する
//            bit.setText(args[0]);            
//            
//            //最初の区切り位置を取得する
//            int startP = bit.first();
//            
//            //startPから始まる単語の次の単語の開始位置を格納する変数
//            int endP = 0;            
//            
//            //next()で次の単語の区切り位置を取得する
//            //next()の結果がBreakIterator.DONEと一致したら文字列の
//            //終端と判断してループを抜ける
//            while( (endP = bit.next()) != BreakIterator.DONE)
//            {
//                  //一つ前の単語の開始位置と現在の単語の開始位置の間の
//                  //文字列を切り取って標準出力に表示する
//                  System.out.println(args[0].substring(startP,endP));
//                  
//                  //現在の単語の開始位置を一つ前の単語の
//                  //開始位置として設定する
//                  startP = endP;
//            }
//            
//            System.out.println("--処理終了--");

	}

	protected static Connection conn_ = null;

	// /**
	// * DBコネクション取得
	// */
	// private void getDBConnection() {
	//        
	// //-------------------------------------------------//
	// // eSMのデータコネクションを取得
	// //-------------------------------------------------//
	// try {
	// conn_ = ConnectionPool.getInstance(null).getConnection();
	// } catch(Exception e){
	// System.out.print("DBに接続できませんでした。" +
	// System.getProperty("line.separator"));
	// System.exit(1);
	// } finally {
	// if (conn_ == null){
	// System.out.print("DBに接続できませんでした。" +
	// System.getProperty("line.separator"));
	// System.exit(1);
	// }
	// }
	//    	
	// }
	//    

	public static void main1(String[] args) throws IOException {
		// System.setOut(new PrintStream(System.out, true, "UTF-8"));
		// System.setErr(new PrintStream(System.err, true, "UTF-8"));

		EdbCKEncoding enc = new EdbCKEncoding(new File(
				"F:/person_import_template.csv"));
		if (enc.getEncoding().equals("null")) {
			System.err.println("文字コードが対応していません\r\nEUC/SJIS/UTF-8等 に変換して下さい。");
			return;
		}
		System.out.println("\nInput File Encoding: " + enc.getEncoding());

		StringBuffer body = new StringBuffer();

		FileInputStream fis = new FileInputStream(
				"F:/person_import_template.csv");
		InputStreamReader isr = new InputStreamReader(fis, enc.getEncoding());
		BufferedReader br = new BufferedReader(isr);
		try {
			String str;
			while ((str = br.readLine()) != null) {
				body.append(str);
				body.append("\n");
			}
			br.close();
			isr.close();
			fis.close();
		} catch (Exception ex) {
			ex.printStackTrace();
			return;
		}
		String[][] records = parsetostring(body.toString());

		for (int i = 0; i < records.length; i++) {
			for (int ii = 0; ii < records[i].length; ii++) {
				System.out.print(records[i][ii]);
				System.out.print(", ");
			}
			System.out.println();
		}
	}

	static String SPLIT_PATTERN = "\t,;:|";

	public void set_splitter(String s_pattern) {
		SPLIT_PATTERN = s_pattern;
	}

	static char get_splitter(String s_pattern, String str) {
		int maxmatch = 0;
		char retsp = ',';

		// count line feed
		int lfmatch = 0;
		Pattern lfp = Pattern.compile("[\n]");
		Matcher lfm = lfp.matcher(str);
		while (lfm.find())
			lfmatch++;

		for (int i = 0; i < s_pattern.length(); i++) {
			Pattern pattern = Pattern.compile("[" + s_pattern.charAt(i) + "]");
			Matcher matcher = pattern.matcher(str);
			int match = 0;
			while (matcher.find())
				match++;
			if (match > maxmatch) {
				maxmatch = match;
				retsp = s_pattern.charAt(i);
			}
		}
		return ',';
	}

	public static String[][] parsetostring(String body) {
		if (body.equals("") || body == null)
			return null;
		String[][] contents = null;
		try {
			char sp = get_splitter(SPLIT_PATTERN, body); // 区切り文字の検査
			if (sp == '\t') {
				body = body.replaceAll("\\Q\t", ",");
				sp = ',';
			}
			// 改行設定
			body = body.replaceAll("\\Q\r\n", "\n").replaceAll("\\Q\r", "\n");
			// parse
			CSVParser csvp = new CSVParser(new StringReader(body), sp, '\"',
					(char) 0);
			contents = csvp.getAllValues();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return contents;
	}

	/**
	 * ファイル内容の文字コードの解析
	 */
	static public class EdbCKEncoding {
		static final int UCS4_TAB = 0x00000009;
		static final int UCS4_NL = 0x0000000a;
		static final int UCS4_CR = 0x0000000d;
		static final int UCS4_SPACE = 0x00000020;
		static final int UCS4_ASCII_upperbound = 0x0000007f;
		static final String[] charset = { "ISO2022JP", "EUC-JP", "SJIS",
				"MS932", "UTF-8", "UTF-16", "UTF-16LE", "UTF-16BE", "JIS0201", };
		String enc = "", decbody = "";

		public EdbCKEncoding(File file) {
			// String charset = System.getProperty("file.encoding");
			// String linesep = System.getProperty("line.separator");
			// System.out.println("charset: "+charset);
			// System.out.println("linesep: "+linesep);
			byte[] body = getByte(file);
			enc = getEncoding(body);
		}

		public EdbCKEncoding(byte[] body) {
			enc = getEncoding(body);
		}

		public String getEncoding() {
			return enc;
		}

		public String getString() {
			return decbody;
		}

		byte[] getByte(File file) {
			byte[] body = null;
			try {
				FileInputStream fin = new FileInputStream(file.getPath());
				byte[] buffer = new byte[8192];
				int rsize = fin.read(buffer);
				if (rsize < 0)
					return body;
				body = new byte[rsize];
				for (int i = 0; i < rsize; i++)
					body[i] = buffer[i];
				fin.close();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			return body;
		}

		boolean compare_array(byte[] diff1, byte[] diff2) {
			int i, len = (diff1.length > diff2.length) ? diff2.length
					: diff1.length;
			for (i = 0; i < len; i++) {
				if (diff1[i] != diff2[i])
					break;
			}
			return (i == len) ? true : false;
		}

		boolean isEnglish(int c) {
			// Basic Latin
			if (UCS4_SPACE <= c && c < UCS4_ASCII_upperbound)
				return true;
			// Latin-1Supplement / Latin Extended-A / Latin Extended-B
			if (0x000000a1 <= c && c <= 0x00000233 && c != 0x000000ad
					&& c != 0x00000221)
				return true;
			// Greek and Coptic
			if (0x00000391 <= c && c <= 0x000003f6 && c != 0x000003a2
					&& c != 0x000003cf)
				return true;
			// Letterlike Symbols
			if (0x00002100 <= c && c <= 0x0000214b && c != 0x0000213b
					&& c != 0x0000213c)
				return true;
			// Letterlike Symbols
			if ((0x00002190 <= c && c <= 0x00002193) || c == 0x000021d2
					|| c == 0x000021d4)
				return true;
			// Mathematical Operators
			if (0x00002200 <= c && c <= 0x000022ff)
				return true;
			return false;
		}

		boolean isAscii(byte[] body) {
			for (int i = 0; i < body.length; i++) {
				if (isEnglish(body[i]) || body[i] == UCS4_NL
						|| body[i] == UCS4_CR || body[i] == UCS4_TAB)
					;
				else
					return false;
			}
			return true;
		}

		String getEncoding(byte[] body) {
			if (body == null)
				return "null";
			if (isAscii(body)) {
				decbody = new String(body);
				return "ASCII";
			}
			for (int i = 0; i < charset.length; i++) {
				try {
					String str = new String(body);
					byte[] body2 = str.getBytes(charset[i]);
					if (compare_array(body, body2)) {
						ByteBuffer bb = ByteBuffer.wrap(body2);
						decbody = new String(Charset.forName(charset[i])
								.decode(bb).array());
						if (charset[i].equals("JIS0201"))
							return "null";
						return charset[i];
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			for (int i = 0; i < charset.length; i++) {
				try {
					String str = new String(body, charset[i]);
					byte[] body2 = str.getBytes(charset[i]);
					if (compare_array(body, body2)) {
						ByteBuffer bb = ByteBuffer.wrap(body2);
						decbody = new String(Charset.forName(charset[i])
								.decode(bb).array());
						if (charset[i].equals("JIS0201"))
							return "null";
						return charset[i];
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			return "null";
		}
	}
}
